<template>
  <div class="permission-wrap">
    <div class="top">
      <el-button type="primary" size="small" @click="addPermission(1, '0', 'add')">添加权限</el-button>
    </div>
    <el-table
      :data="permissionList"
      style="width: 100%;margin-bottom: 20px;"
      row-key="id"
      border
      default-expand-all
      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
    >
      <el-table-column
        prop="name"
        label="名称"
        sortable
        width="180"
      />
      <el-table-column
        prop="code"
        label="标识"
        sortable
        width="180"
      />
      <el-table-column
        prop="description"
        label="描述"
      />
      <el-table-column
        label="操作"
      >
        <template v-slot="{ row }">
          <el-button type="text" @click="addPermission(2, row.id, 'add')">添加</el-button>
          <el-button type="text" @click="addPermission(2, row.id, 'edit')">编辑</el-button>
          <el-button type="text" @click="deletePermission(row.id)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>

    <!-- 给子组件上面添加一个 弹出框显示隐藏的变量，加入到v-if上面去，这样的话，弹出框没有显示的时候v-if就是false -->
    <!-- 那么这个组件就不会渲染出来，created就不会执行 -- 借助于v-if -->
    <!-- :value="value" @input="value = $event"  简写为v-model -->
    <!-- 弹出框的逻辑，在工作里面如果封装了组件，尽量的去用v-if来控制组件的 创建和销毁 -->
    <PermissionCom v-if="value" ref="permissionRef" v-model="value" :type="type" :pid="pid" :list="list" :is-add-or-edit="isAddOrEdit" @ADD_SUCCESS="getPermissionList" />
  </div>
</template>

<script>
import { getPermissionListRequest, deletePermissionRequest } from '@/api/permission'
import { transfromListToTree } from '@/utils'
import PermissionCom from './components/PermissionCom.vue'

export default {
  components: { PermissionCom },
  data() {
    return {
      permissionList: [],
      type: 1,
      pid: '0',
      isAddOrEdit: 'add',
      list: [],
      value: false
    }
  },
  created() {
    this.getPermissionList()
  },
  methods: {
    async getPermissionList() {
      const res = await getPermissionListRequest()
      // list数据是传递给子组件使用的
      this.list = res.data
      console.log(res)
      // 下面这个数据是给树形table组件使用的
      this.permissionList = transfromListToTree(res.data, 0)
    },
    addPermission(type, pid, isAddOrEdit) {
      // 这种打开弹出框的方式，是通过ref调用子组件自己的方法
      console.log(type, pid)
      this.type = type
      this.pid = pid

      this.isAddOrEdit = isAddOrEdit // 'add' 'edit'

      // this.$refs.permissionRef.openDialog()  打开弹出框的第一中方法
      this.value = true // 打开弹出框的第二种方法
    },
    deletePermission(id) {
      this.$confirm('是否删除当前权限', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(async() => {
        await deletePermissionRequest(id)
        // 删除成功以后 刷新列表页面
        this.getPermissionList()
        this.$message({
          type: 'success',
          message: '删除成功!'
        })
      }).catch(() => {
        // 删除失败 响应拦截器会有统一处理，这里不需要在给提示
      })
    }
  }
}
</script>

<style lang="scss" scoped>
.permission-wrap {
  .top {
    margin-bottom: 20px;
  }
}
</style>
